﻿using Aker.DevTeam;
using DevExpress.Utils;
using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Controls;
using DevExpress.XtraGrid.Views.Base;
using DevExpress.XtraGrid.Views.Grid.ViewInfo;
using DevExpress.XtraReports.UI;
using Extensions;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Windows.Forms;

namespace Aker.Hammadde
{
    public partial class Iplik : XForm
    {
        DataTable dtGrup = new DataTable();
        int ipgId = -1;
        int ipId = -1;
        Renk renk = new Renk(1);

        private class Karisim
        {
            public Karisim(decimal oran, string ad)
            {
                this.oran = oran;
                this.ad = ad;
            }
            public decimal oran;
            public string ad;
        }

        public Iplik()
        {
            InitializeComponent();
        }

        private void Iplik_Load(object sender, EventArgs e)
        {
            if (AppSession.UserInfo.UserId == 2)
                btnDeveloper.Visible = true;

            Data.TAM.IplikTableAdapter.Fill(Data.DB.Iplik);
            Data.TAM.IplikGrupTableAdapter.Fill(Data.DB.IplikGrup);
            Data.TAM.IplikKarisimTableAdapter.Fill(Data.DB.IplikKarisim);
            Data.TAM.IplikCekmeTipiTableAdapter.Fill(Data.DB.IplikCekmeTipi);
            Data.TAM.IplikCekimTableAdapter.Fill(Data.DB.IplikCekim);
            Data.TAM.IplikFantaziTableAdapter.Fill(Data.DB.IplikFantazi);
            Data.TAM.IplikParlaklikTableAdapter.Fill(Data.DB.IplikParlaklik);
            Data.TAM.IplikRenkTableAdapter.Fill(Data.DB.IplikRenk);
            Data.TAM.TedarikciTableAdapter.Fill(Data.DB.Tedarikci);

            Data.TAM.ShelfTableAdapter.Fill(Data.DB.Shelf);
            Data.TAM.IplikFantaziTableAdapter.Fill(Data.DB.IplikFantazi);

            DataTable dtStokLines = Data.DM.ExecuteDataTable("GetStokLines", 2);
            Data.DB.StokLines.Merge(dtStokLines);

            leFantazi.Properties.DataSource = Data.DB.IplikFantazi;
            leFantazi.Properties.DisplayMember = "Fantazi";
            leFantazi.Properties.ValueMember = "Fantazi";

            leKarisim1.Bind(Data.DB.IplikKarisim, "Karisim", "IplikKarisimId");
            seOran1.EditValue = null;
            leKarisim1.EditValue = null;

            leKarisim2.Bind(Data.DB.IplikKarisim, "Karisim", "IplikKarisimId");
            leKarisim2.EditValue = null;
            seOran2.EditValue = null;

            leKarisim3.Bind(Data.DB.IplikKarisim, "Karisim", "IplikKarisimId");
            leKarisim3.EditValue = null;
            seOran3.EditValue = null;

            leIplikCekmeTipi.Bind(Data.DB.IplikCekmeTipi, "CekmeTipi", "IplikCekmeTipiId");
            leIplikCekmeTipi.EditValue = null;

            leIplikCekim.Bind(Data.DB.IplikCekim, "Cekim", "IplikCekimId");
            leIplikCekim.EditValue = null;

            leIplikParlaklik.Bind(Data.DB.IplikParlaklik, "Parlaklik", "IplikParlaklikId");
            leIplikParlaklik.EditValue = null;


            Data.TAM.BoyahaneTableAdapter.Fill(Data.DB.Boyahane);
            leBoyahane.Bind(Data.DB.Boyahane, "Boyahane", "BoyahaneId");
            leBoyahane.EditValue = null;

            DataTable dtX = Data.DM.ExecuteDataTable("GetRaflar");
            leShelf.Bind(dtX, "Shelf", "ShelfId");
            leShelf.EditValue = null;

            leGrup.Bind(Data.DB.IplikGrup.DefaultView.ToTable(false, "IplikGrupId", "GrupKodu"), "GrupKodu", "IplikGrupId");
            leRenk.CustomDisplayText += leRenk_CustomDisplayText;
            leRenk.QueryPopUp += leRenk_QueryPopUp;
            leTedarikci.Bind(Data.DB.Tedarikci, "Unvan", "TedarikciId");


            GridManager.GetManager(gvGrup).GridMenu.AddMenu("İplik Grubunu Güncelle", GrupDuzenle);

            BindGrup();
            gvGrup.OptionsView.ShowViewCaption = false;

            txtKalinlik.EditValueChanged += grupFilterChanged;
            txtElyafOzelligi.EditValueChanged += grupFilterChanged;
            txtAciklama.EditValueChanged += grupFilterChanged;
            leFantazi.EditValueChanged += grupFilterChanged;
            leIplikCekmeTipi.EditValueChanged += grupFilterChanged;
            leIplikCekim.EditValueChanged += grupFilterChanged;
            leIplikParlaklik.EditValueChanged += grupFilterChanged;
            leKarisim1.EditValueChanged += grupFilterChanged;
            leKarisim2.EditValueChanged += grupFilterChanged;
            leKarisim3.EditValueChanged += grupFilterChanged;
            seOran1.EditValueChanged += grupFilterChanged;
            seOran2.EditValueChanged += grupFilterChanged;
            seOran3.EditValueChanged += grupFilterChanged;

            BindIplik();

            leGrup.EditValueChanged += ipFilterChanged;
            leTedarikci.EditValueChanged += ipFilterChanged;
            leRenk.EditValueChanged += ipFilterChanged;
            txtLot.EditValueChanged += ipFilterChanged;
            txtAltAciklama.EditValueChanged += ipFilterChanged;
            leBoyahane.EditValueChanged += ipFilterChanged;

            GridMenu gmDetay = GridManager.GetManager(gvIplik).GridMenu;
            gmDetay.AddMenu("İpliği Güncelle", IplikDuzenle);
            gmDetay.AddMenu("Barkod Yazdır", BarkodYazdir);
            gmDetay.AddMenu("Bu Renkten Yeni Giriş Yap", YeniGiris);

            gvGrup.EnableComplexFiltering("GrupAdi");

            gvGrup.RowCellClick += gvGrup_RowCellClick;
        }

        private void YeniGiris(object sender, EventArgs e)
        {
            ipId = 0;
            int currentIpId = gvIplik.GetFocusedRowCellValue("IplikId").ToIntNN();
            if (currentIpId > 0)
            {
                btnElyafEkle.Text = "İplik Ekle";

                Aker.AkerDB.IplikRow i = Data.DB.Iplik.FindByIplikId(currentIpId);

                leGrup.EditValue = null; //force editValuChanged
                leGrup.EditValue = i.IplikGrupId;

                if (!i.IsTedarikciIdNull())
                    leTedarikci.EditValue = i.TedarikciId;
                else
                    leTedarikci.EditValue = null;

                if (!i.IsRenkIdNull())
                    leRenk.EditValue = i.RenkId;
                else
                    leRenk.EditValue = null;

                if (!i.IsLotNull())
                    txtLot.Text = i.Lot;
                else
                    txtLot.Text = "";

                if (!i.IsAciklamaNull())
                    txtAltAciklama.Text = i.Aciklama;
                else
                    txtAltAciklama.Text = "";


                if (!i.IsFiyatNull())
                {
                    seFiyat.EditValue = i.Fiyat;
                    if (!i.IsKDVNull())
                        chkKDV.Checked = i.KDV;
                }
                else
                {
                    seFiyat.EditValue = null;
                    chkKDV.Checked = false;
                }




                if (!i.IsCurrencyIdNull())
                    cmbCurrencyId.SelectedIndex = i.CurrencyId - 1;
                else
                    cmbCurrencyId.SelectedIndex = 0;

                DataRow[] sls = Data.DB.StokLines.Select("IplikId=" + i.IplikId + " and ShelfId is not null");
                if (sls.Length == 1)
                    leShelf.EditValue = sls[0]["ShelfId"].ToIntNN();
                else
                    leShelf.EditValue = null;


                if (!i.IsBoyahaneIdNull())
                    leBoyahane.EditValue = i.BoyahaneId;
                else
                    leBoyahane.EditValue = null;

                btnEndIpEditing.Visible = false;

                seKG.Focus();
            }
        }

        private void BarkodYazdir(object sender, EventArgs e)
        {
            int[] rows = gvIplik.GetSelectedRows();
            if (rows.Length == 0 && gvIplik.FocusedRowHandle > -1)
                rows = new int[] { gvIplik.FocusedRowHandle };

            if (rows.Length > 0)
            {
                List<int> ids = new List<int>();
                foreach (int i in rows)
                    ids.Add(gvIplik.GetDataRow(i)["IplikId"].ToIntNN());

                ProductReportSettings settings = new ProductReportSettings();
                settings.chkManualSirali.Checked = false;
                settings.chkManualSirali.Visible = false;
                settings.lblManual.Visible = false;

                if (settings.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    int emptyCount = Convert.ToInt32(settings.emptyCount.Value);
                    int copyCount = Convert.ToInt32(settings.copyCount.Value);
                    HammaddeReport hr = new HammaddeReport(2, String.Join(",", ids), emptyCount, copyCount);
                    hr.ShowPreview();
                }
            }
            else
                ShowError("Barkod yazdırmak için satırları seçin !");
        }

        private void BindGrup()
        {
            dtGrup = Data.DM.ExecuteDataTable("GetIplikGrup");
            gvGrup.Init(dtGrup);
            gvGrup.MakeRowSelectable();
            gvGrup.MakeReadOnly();
            gvGrup.MakeColumnInvisible("k1", "o1", "k2", "o2", "k3", "o3");
            gvGrup.SetCaptions("IplikGrupId:İplik Grup No", "Kalinlik:Kalınlık", "GrupAdi:Grup Adı", "ElyafOzelligi:Elyaf Özelliği", "GrupAciklama:Açıklama", "Cekme Tipi:Çekme Tipi", "Cekim:Çekim", "Parlaklik:Parlaklık");

            gvGrup.BestFitColumns();
        }

        void gvGrup_RowCellClick(object sender, DevExpress.XtraGrid.Views.Grid.RowCellClickEventArgs e)
        {
            SetIplik();
        }

        private void BindIplik()
        {
            string filter = gvIplik.ActiveFilterString;
            gvIplik.Init(Data.DM.ExecuteDataTable("GetIplik", 0));
            gvIplik.MakeColumnInvisible("IplikGrupId");
            gvIplik.OptionsView.ShowViewCaption = false;
            gvIplik.MakeRowSelectable();
            gvIplik.OptionsSelection.MultiSelect = true;
            gvIplik.MakeReadOnly();
            gvIplik.ActiveFilterString = filter;
            //gvIplik.AddSummary("KG", "CuvalBot");
            gvIplik.SetCaptions("IplikId:İplik No", "Tedarikci:Tedarikçi", "Symbol:Parabirimi", "CuvalBot:Çuval/Bot");
            //gvIplik.FormatAsNumber("KG");
            //gvIplik.FormatAsNumber(0, "CuvalBot");
            gvIplik.BestFitColumns();

            leTedarikci.EditValue = null;
            leRenk.EditValue = null;
            leBoyahane.EditValue = null;
            leShelf.EditValue = null;

            txtLot.Text = "";
            txtAltAciklama.Text = "";
            seKG.EditValue = null;
            seFiyat.EditValue = null;
            chkKDV.Checked = false;
            seCuvalBot.EditValue = null;
            cmbCurrencyId.SelectedIndex = 0;
        }

        private void btnEditList_Click(object sender, EventArgs e)
        {
            string ListName = (sender as SimpleButton).Tag.ToStringNN();

            ListeDuzenleme ld = new ListeDuzenleme(ListName);
            ld.ShowDialog();
        }

        private void leRenk_CustomDisplayText(object sender, CustomDisplayTextEventArgs e)
        {
            int renkId = leRenk.EditValue.ToIntNN();
            if (renkId > 0)
            {
                AkerDB.IplikRenkRow ip = Data.DB.IplikRenk.FindByRenkId(renkId);
                string kod = "";
                if (!ip.IsKodNull())
                    kod = ip.Kod + "/";
                if (!ip.IsRenkNull())
                    kod = kod + ip.Renk;
                else
                    kod = kod.Substring(0, kod.Length - 1);
                e.DisplayText = kod;
            }
            else
                e.DisplayText = "Seçiniz...";
        }

        private void gvGrup_FocusedRowChanged(object sender, FocusedRowChangedEventArgs e)
        {
            if (e.FocusedRowHandle > -1)
                SetIplik();
        }

        private void SetIplik()
        {
            System.Data.DataRow dr = gvGrup.GetFocusedDataRow();

            string grupKodu = dr["GrupKodu"].ToStringNN();
            leGrup.EditValue = dr["IplikGrupId"].ToIntNN();

            GenerateFilterIplik();
            gvIplik.BestFitColumns();
        }

        private string[] GetVals(DataRow dr, params string[] colNames)
        {
            List<string> vals = new List<string>();
            foreach (string colName in colNames)
            {
                vals.Add(dr[colName].ToStringNN().Trim());
            }
            return vals.ToArray();
        }

        private void toolTipController_GetActiveObjectInfo(object sender, ToolTipControllerGetActiveObjectInfoEventArgs e)
        {
            if (e.SelectedControl != gcIplik)
                return;

            GridHitInfo hitInfo = gvIplik.CalcHitInfo(e.ControlMousePosition);

            if (hitInfo.InRow == false)
                return;

            SuperToolTipSetupArgs toolTipArgs = new SuperToolTipSetupArgs();


            DataRow dr = gvIplik.GetDataRow(hitInfo.RowHandle);
            if (dr == null)
                return;

            toolTipArgs.Title.Text = "IP." + dr["IplikGrupId"].ToString().PadLeft(3, '0') + " Grup Özellikleri";

            DataRow[] drGrups = dtGrup.Select("IplikGrupId = " + dr["IplikGrupId"]);
            if (drGrups != null)
            {
                DataRow drGrup = drGrups[0];

                string BodyText = String.Format(
                    //"<b>Grup Adı:</b>  {0}" +

                                                "\r\n<b>Çekme Tipi:</b>  {0}" +
                                                "\r\n<b>Kalınlık:</b>  {1}" +
                                                "\r\n<b>Fantazi:</b>  {2}" +
                                                "\r\n<b>Açıklama:</b>  {3}"

                , GetVals(drGrup, "CekmeTipi", "Kalinlik", "Fantazi", "GrupAciklama")
                );

                toolTipArgs.Contents.Text = BodyText;
                toolTipArgs.AllowHtmlText = DefaultBoolean.True;
            }

            e.Info = new ToolTipControlInfo();
            e.Info.Object = hitInfo.HitTest.ToString() + hitInfo.RowHandle.ToString();
            e.Info.ToolTipType = ToolTipType.SuperTip;
            e.Info.SuperTip = new SuperToolTip();
            e.Info.SuperTip.Setup(toolTipArgs);
        }

        private void txtKalinlik_Validating(object sender, CancelEventArgs e)
        {
            UpdateKalinlik();
        }

        private bool UpdateKalinlik()
        {
            return true;
            string[] parts = txtKalinlik.Text.Trim().Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);


            if (parts.Length == 0)
            {
                XtraMessageBox.Show("Kalınlık zorunlu alandır !", Language.Uyari, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }
            else if (parts.Length == 1)
            {
                parts = txtKalinlik.Text.Trim().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                if (parts.Length == 1)
                {
                    XtraMessageBox.Show(txtKalinlik.Text + " Sayı/DTEX|NM|DN|NE olarak girilmeli !", Language.Uyari, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return false;
                }
                else if (parts.Length == 2)
                {
                    if (!(parts[0].Replace(".", "").ToIntNN() > 0))
                    {
                        XtraMessageBox.Show(txtKalinlik.Text + " Sayı/DTEX|NM|DN|NE olarak girilmeli !", Language.Uyari, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        return false;
                    }
                    else if (!("DTEX NM DN NE").Contains(parts[1].ToUpper()))
                    {
                        XtraMessageBox.Show(txtKalinlik.Text + " Sayı/DTEX|NM|DN|NE olarak girilmeli !", Language.Uyari, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        return false;
                    }
                    else
                    {
                        txtKalinlik.Text = parts[0] + " " + parts[1].ToUpper();
                        return true;
                    }
                }
            }
            else if (parts.Length == 2)
            {
                int p1 = parts[0].ToIntNN();
                int p2 = parts[1].ToIntNN();

                if (p1 < 0 && p2 < 0)
                {
                    XtraMessageBox.Show(txtKalinlik.Text + " Parçalardan en az biri sayısal olmalı!", Language.Uyari, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return false;
                }

                //if (p1 > p2)
                //    txtKalinlik.Text = parts[1].Trim() + "/" + parts[0].Trim();
                //else
                txtKalinlik.Text = parts[0].Trim() + "/" + parts[1].Trim();
            }

            return true;


            //List<decimal> numbers = new List<decimal>();
            //List<string> letters = new List<string>();

            //foreach (string part in parts)
            //{
            //    bool isLetter = Char.IsLetter(part.ToCharArray()[0]);

            //    if (isLetter)
            //    {
            //        foreach (Char c in part)
            //        {
            //            if (!Char.IsLetter(c))
            //            {
            //                XtraMessageBox.Show(part + " parçası harf ile başladığından tümü harf olmalı !", Language.Uyari, MessageBoxButtons.OK, MessageBoxIcon.Warning);
            //                return false;
            //            }
            //        }

            //        letters.Add(part);
            //    }
            //    else
            //    {
            //        foreach (Char c in part)
            //        {
            //            if (!Char.IsDigit(c))
            //            {
            //                XtraMessageBox.Show(part + " parçası sayı ile başladığından tümü sayı olmalı !", Language.Uyari, MessageBoxButtons.OK, MessageBoxIcon.Warning);
            //                return false;
            //            }
            //        }

            //        numbers.Add(part.ToDecimalNN());
            //    }

            //}

            //numbers.Sort();
            //numbers.Reverse();

            //foreach (decimal val in numbers)
            //    letters.Add(val.ToString());


            //txtKalinlik.Text = string.Join("/", letters.ToArray());

            //return true;
        }

        private void seOran1_EditValueChanged(object sender, EventArgs e)
        {
            int val = seOran1.EditValue.ToIntNN();
            if (seOran3.EditValue.ToIntNN() < 1)
                seOran2.EditValue = 100 - val;
        }

        private void grupFilterChanged(object sender, EventArgs e)
        {
            GenerateFilterGrup();
        }


        private void GenerateFilterGrup()
        {
            List<string> filters = new List<string>();

            if (leIplikCekmeTipi.EditValue.ToIntNN() > 0)
                filters.Add("CekmeTipi = '" + leIplikCekmeTipi.Text + "'");
            if (leIplikCekim.EditValue.ToIntNN() > 0)
                filters.Add("Cekim= '" + leIplikCekim.Text + "'");
            if (leIplikParlaklik.EditValue.ToIntNN() > 0)
                filters.Add("Parlaklik = '" + leIplikParlaklik.Text + "'");

            if (leKarisim1.EditValue.ToIntNN() > 0)
                filters.Add("k1 = '" + leKarisim1.Text + "'");
            if (leKarisim2.EditValue.ToIntNN() > 0)
                filters.Add("k2 = '" + leKarisim2.Text + "'");
            if (leKarisim3.EditValue.ToIntNN() > 0)
                filters.Add("k3 = '" + leKarisim3.Text + "'");

            if (seOran1.EditValue.ToIntNN() > 0)
                filters.Add("StartsWith([o1], '" + seOran1.EditValue.ToStringNN() + "')");
            if (seOran2.EditValue.ToIntNN() > 0)
                filters.Add("StartsWith([o2], '" + seOran2.EditValue.ToStringNN() + "')");
            if (seOran3.EditValue.ToIntNN() > 0)
                filters.Add("StartsWith([o3], '" + seOran3.EditValue.ToStringNN() + "')");

            if (txtKalinlik.EditValue.ToStringNN() != "")
                filters.Add("StartsWith([Kalinlik], '" + txtKalinlik.EditValue.ToStringNN() + "')");
            if (txtElyafOzelligi.EditValue.ToStringNN() != "")
                filters.Add("StartsWith([ElyafOzelligi], '" + txtElyafOzelligi.EditValue.ToStringNN() + "')");
            if (leFantazi.EditValue.ToStringNN() != "")
                filters.Add("StartsWith([Fantazi], '" + leFantazi.EditValue.ToStringNN() + "')");
            if (txtAciklama.EditValue.ToStringNN() != "")
                filters.Add("StartsWith([GrupAciklama], '" + txtAciklama.EditValue.ToStringNN() + "')");

            gvGrup.ActiveFilterString = String.Join(" and ", filters);
        }

        private void ipFilterChanged(object sender, EventArgs e)
        {
            GenerateFilterIplik();
        }



        private void GenerateFilterIplik()
        {
            List<string> filters = new List<string>();

            if (leGrup.EditValue.ToIntNN() > -1)
                filters.Add("[IplikGrupId] = " + leGrup.EditValue.ToIntNN());

            if (leTedarikci.EditValue.ToIntNN() > 0)
                filters.Add("Tedarikci = '" + leTedarikci.Text + "'");

            if (leRenk.EditValue.ToIntNN() > 0)
                filters.Add("Renk = '" + leRenk.Text + "'");

            if (leBoyahane.EditValue.ToIntNN() > -1)
                filters.Add("Boyahane = '" + leBoyahane.Text + "'");

            if (txtLot.EditValue.ToStringNN() != "")
                filters.Add("StartsWith([Lot], '" + txtLot.EditValue.ToStringNN() + "')");

            if (txtAltAciklama.EditValue.ToStringNN() != "")
                filters.Add("StartsWith([Aciklama], '" + txtAltAciklama.EditValue.ToStringNN() + "')");

            gvIplik.ActiveFilterString = String.Join(" and ", filters);
        }

        private void btnDeveloper_Click(object sender, EventArgs e)
        {
            foreach (DataRow dr in Data.DB.IplikGrup.Select("Karisim is null"))
            {
                int grupId = dr["IplikGrupId"].ToIntNN();
                FillGrup(grupId);

                btnGrupEkle.PerformClick();
            }
        }

        private void GrupDuzenle(object sender, EventArgs e)
        {
            int grupId = gvGrup.GetFocusedRowCellValue("IplikGrupId").ToIntNN();
            if (grupId > 0)
                FillGrup(grupId);
        }

        private void IplikDuzenle(object sender, EventArgs e)
        {
            int ipId = gvIplik.GetFocusedRowCellValue("IplikId").ToIntNN();
            if (ipId > 0)
            {
                this.ipId = ipId;
                btnElyafEkle.Text = "İplik Güncelle";

                Aker.AkerDB.IplikRow i = Data.DB.Iplik.FindByIplikId(ipId);

                leGrup.EditValue = null; //force editValuChanged
                leGrup.EditValue = i.IplikGrupId;

                if (!i.IsTedarikciIdNull())
                    leTedarikci.EditValue = i.TedarikciId;
                else
                    leTedarikci.EditValue = null;

                if (!i.IsRenkIdNull())
                    leRenk.EditValue = i.RenkId;
                else
                    leRenk.EditValue = null;

                if (!i.IsLotNull())
                    txtLot.Text = i.Lot;
                else
                    txtLot.Text = "";

                if (!i.IsAciklamaNull())
                    txtAltAciklama.Text = i.Aciklama;
                else
                    txtAltAciklama.Text = "";

                DataRow[] sls = Data.DB.StokLines.Select("IplikId=" + i.IplikId);
                if (sls.Length == 1)
                {
                    if (sls[0]["KG"].ToDecimalNN() > 0)
                        seKG.EditValue = sls[0]["KG"].ToDecimalNN();
                    else
                        seKG.EditValue = null;

                    if (sls[0]["ShelfId"].ToIntNN() > 0)
                        leShelf.EditValue = sls[0]["ShelfId"].ToIntNN();
                    else
                        leShelf.EditValue = null;

                    if (sls[0]["Adet"].ToIntNN() > 0)
                        seCuvalBot.EditValue = sls[0]["Adet"].ToIntNN();
                    else
                        seCuvalBot.EditValue = null;
                }
                else
                    throw new ApplicationException("Birden çok giriş var!!");




                if (!i.IsFiyatNull())
                {
                    seFiyat.EditValue = i.Fiyat;
                    if (!i.IsKDVNull())
                        chkKDV.Checked = i.KDV;
                }
                else
                {
                    seFiyat.EditValue = null;
                    chkKDV.Checked = false;
                }




                if (!i.IsCurrencyIdNull())
                    cmbCurrencyId.SelectedIndex = i.CurrencyId - 1;
                else
                    cmbCurrencyId.SelectedIndex = 0;

                if (!i.IsBoyahaneIdNull())
                    leBoyahane.EditValue = i.BoyahaneId;
                else
                    leBoyahane.EditValue = null;

                btnEndIpEditing.Visible = true;
            }
        }

        private void FillGrup(int GrupId)
        {
            ipgId = GrupId;
            btnGrupEkle.Text = "İplik Grubunu Güncelle";

            Aker.AkerDB.IplikGrupRow i = Data.DB.IplikGrup.FindByIplikGrupId(ipgId);

            txtKalinlik.Text = "";
            btnKarisim2Null.PerformClick();
            btnKarisim3Null.PerformClick();
            txtElyafOzelligi.Text = "";
            btnIplikCekmeTipiNull.PerformClick();
            btnIplikCekimNull.PerformClick();
            leFantazi.Text = "";
            txtAciklama.Text = "";

            seOran1.EditValue = 0;
            seOran2.EditValue = 0;
            seOran3.EditValue = 0;

            if (!i.IsKalinlikNull())
                txtKalinlik.Text = i.Kalinlik;

            if (!i.IsIplikKarisimOrani1Null())
                seOran1.EditValue = i.IplikKarisimOrani1;

            if (!i.IsIplikKarisimOrani2Null())
                seOran2.EditValue = i.IplikKarisimOrani2;

            if (!i.IsIplikKarisimOrani3Null())
                seOran3.EditValue = i.IplikKarisimOrani3;

            if (!i.IsIplikKarisimId1Null())
                leKarisim1.EditValue = i.IplikKarisimId1;

            if (!i.IsIplikKarisimId2Null())
                leKarisim2.EditValue = i.IplikKarisimId2;

            if (!i.IsIplikKarisimId3Null())
                leKarisim3.EditValue = i.IplikKarisimId3;

            if (!i.IsElyafOzelligiNull())
                txtElyafOzelligi.Text = i.ElyafOzelligi;

            if (!i.IsIplikCekmeTipiIdNull())
                leIplikCekmeTipi.EditValue = i.IplikCekmeTipiId;

            if (!i.IsIplikCekimIdNull())
                leIplikCekim.EditValue = i.IplikCekimId;

            if (!i.IsIplikParlaklikIdNull())
                leIplikParlaklik.EditValue = i.IplikParlaklikId;

            if (!i.IsFantaziNull())
                leFantazi.EditValue = i.Fantazi;

            if (!i.IsAciklamaNull())
                txtAciklama.Text = i.Aciklama;

            btnEndGrupEditing.Visible = true;
        }

        private void btnEndGrupEditing_Click(object sender, EventArgs e)
        {
            ipgId = -1;
            btnGrupEkle.Text = "İplik Grubu Ekle";
            btnEndGrupEditing.Visible = false;
        }

        private void btnEndIpEditing_Click(object sender, EventArgs e)
        {
            ipId = -1;
            btnElyafEkle.Text = "İplik Ekle";
            btnEndIpEditing.Visible = false;
        }

        private void btnGrupEkle_Click(object sender, EventArgs e)
        {
            if (txtKalinlik.Text.Trim() == "")
            {
                XtraMessageBox.Show("Kalınlığı boş bırakamazsınız !", Language.Uyari, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            int oran1 = seOran1.EditValue.ToIntNN();
            int oran2 = seOran2.EditValue.ToIntNN();
            int oran3 = seOran3.EditValue.ToIntNN();

            int kar1 = leKarisim1.EditValue.ToIntNN();
            int kar2 = leKarisim2.EditValue.ToIntNN();
            int kar3 = leKarisim3.EditValue.ToIntNN();

            if (oran1 < 0 || kar1 < 0)
            {
                XtraMessageBox.Show("Karışım-1'i boş bırakamazsınız !", Language.Uyari, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            AkerDB.IplikGrupRow iplikGrup;

            if (ipgId > 0)
                iplikGrup = Data.DB.IplikGrup.FindByIplikGrupId(ipgId);
            else
                iplikGrup = Data.DB.IplikGrup.NewIplikGrupRow();

            List<Karisim> pairs = new List<Karisim>();

            if (!UpdateKalinlik())
                return;

            string strKar1 = "";
            string strKar2 = "";
            string strKar3 = "";

            if (kar1 > 0)
                strKar1 = leKarisim1.Text;

            if (kar2 > 0)
                strKar2 = leKarisim2.Text;

            if (kar3 > 0)
                strKar3 = leKarisim3.Text;

            int toplam = 0;

            if (oran1 > 0)
            {
                toplam += oran1;
                pairs.Add(new Karisim(oran1, strKar1));
            }

            if (oran2 > 0)
            {
                toplam += oran2;
                pairs.Add(new Karisim(oran2, strKar2));
            }

            if (oran3 > 0)
            {
                toplam += oran3;
                pairs.Add(new Karisim(oran3, strKar3));
            }

            else if (toplam > 0 && toplam != 100)
            {
                XtraMessageBox.Show(oran1 + "," + oran2 + "," + oran3 + ":Karışım oranları toplamı 100 olmalı !", Language.Uyari, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            if (oran1 * kar1 < 0 || oran2 * kar2 < 0 || oran3 * kar3 < 0)
            {
                XtraMessageBox.Show("Oran yazıldıysa karışım seçilmeli, karışım seçildiyse oran yazılmalı !", Language.Uyari, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            if (kar2 == -1 && kar3 != -1)
            {
                XtraMessageBox.Show("Karışım-2'yi boş bırakıp Karışım-3'ü dolduramazsınız !", Language.Uyari, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            if (leFantazi.Text != "")
                iplikGrup.Fantazi = leFantazi.Text;
            else
                iplikGrup.SetFantaziNull();



            if (leIplikCekim.EditValue.ToIntNN() > 0)
                iplikGrup.IplikCekimId = leIplikCekim.EditValue.ToIntNN();
            else
                iplikGrup.SetIplikCekimIdNull();

            if (leIplikParlaklik.EditValue.ToIntNN() > 0)
                iplikGrup.IplikParlaklikId = leIplikParlaklik.EditValue.ToIntNN();
            else
                iplikGrup.SetIplikParlaklikIdNull();



            if (leIplikCekmeTipi.EditValue.ToIntNN() > 0)
                iplikGrup.IplikCekmeTipiId = leIplikCekmeTipi.EditValue.ToIntNN();
            else
                iplikGrup.SetIplikCekmeTipiIdNull();

            if (kar1 > 0)
                iplikGrup.IplikKarisimId1 = kar1;
            else
                iplikGrup.SetIplikKarisimId1Null();

            if (kar2 > 0)
                iplikGrup.IplikKarisimId2 = kar2;
            else
                iplikGrup.SetIplikKarisimId2Null();

            if (kar3 > 0)
                iplikGrup.IplikKarisimId3 = kar3;
            else
                iplikGrup.SetIplikKarisimId3Null();

            if (oran1 > 0)
                iplikGrup.IplikKarisimOrani1 = oran1;
            else
                iplikGrup.SetIplikKarisimOrani1Null();

            if (oran2 > 0)
                iplikGrup.IplikKarisimOrani2 = oran2;
            else
                iplikGrup.SetIplikKarisimOrani2Null();

            if (oran3 > 0)
                iplikGrup.IplikKarisimOrani3 = oran3;
            else
                iplikGrup.SetIplikKarisimOrani3Null();

            if (txtKalinlik.Text != "")
                iplikGrup.Kalinlik = txtKalinlik.Text;
            else
                iplikGrup.SetKalinlikNull();

            if (txtElyafOzelligi.Text != "")
                iplikGrup.ElyafOzelligi = txtElyafOzelligi.Text;
            else
                iplikGrup.SetElyafOzelligiNull();

            if (txtAciklama.Text != "")
                iplikGrup.Aciklama = txtAciklama.Text;
            else
                iplikGrup.SetAciklamaNull();

            var x = pairs.OrderByDescending(k => k.oran).ToList();

            string ad = "";
            if (!iplikGrup.IsKalinlikNull())
                ad = iplikGrup.Kalinlik + " ";

            string prefix1 = "";
            string prefix2 = "";

            foreach (Karisim pair in x)
            {
                prefix1 += pair.ad + " ";
                prefix2 += pair.oran + "/";
            }

            if (prefix2.EndsWith("/"))
                prefix2 = prefix2.Substring(0, prefix2.Length - 1);

            if (prefix2 == "100")
                prefix2 = "";

            ad = ad + prefix1 + prefix2;

            if (prefix1 != "")
                iplikGrup.Karisim = prefix1;

            if (prefix2 != "")
                iplikGrup.Oran = prefix2;

            if (!iplikGrup.IsElyafOzelligiNull())
                ad = ad + " " + iplikGrup.ElyafOzelligi;

            if (leIplikCekmeTipi.EditValue.ToIntNN() > 0)
                ad = ad + " " + leIplikCekmeTipi.Text;
            if (leIplikCekim.EditValue.ToIntNN() > 0)
                ad = ad + " " + leIplikCekim.Text;
            if (leIplikParlaklik.EditValue.ToIntNN() > 0)
                ad = ad + " " + leIplikParlaklik.Text;
            if (leFantazi.Text != "")
                ad = ad + " " + leFantazi.Text;

            if (!iplikGrup.IsAciklamaNull() && iplikGrup.Aciklama != "")
                ad = ad + " " + iplikGrup.Aciklama;

            ad = ad.Replace("\r\n", "").Trim();

            while (ad.Contains("  "))
                ad = ad.Replace("  ", " ");

            iplikGrup.GrupAdi = ad;

            iplikGrup.GrupKodu = "IP." + iplikGrup.IplikGrupId.ToString().PadLeft(3, '0');

            if (ipgId < 1)
                Data.DB.IplikGrup.AddIplikGrupRow(iplikGrup);

            Data.TAM.IplikGrupTableAdapter.Update(iplikGrup);

            if (ipgId < 1)
            {
                iplikGrup.GrupKodu = "IP." + iplikGrup.IplikGrupId.ToString().PadLeft(3, '0');
                Data.TAM.IplikGrupTableAdapter.Update(iplikGrup);
            }

            BindGrup();

            leGrup.Bind(Data.DB.IplikGrup.DefaultView.ToTable(false, "IplikGrupId", "GrupKodu"), "GrupKodu", "IplikGrupId");
            gvGrup.FocusedRowHandle = gvGrup.RowCount - 1;

            txtKalinlik.Text = "";
            //txtAciklama.Text = "";
            //txtElyafOzelligi.Text = "";
            //txtAciklama.Text = "";
            //leFantazi.Text = "";

            //btnKarisim2Null.PerformClick();
            //btnKarisim3Null.PerformClick();

            //btnIplikCekmeTipiNull.PerformClick();
            //btnIplikCekimNull.PerformClick();
            //btnIplikParlaklikNull.PerformClick();

            btnEndGrupEditing.PerformClick();
        }

        private void btnIplikEkle_Click(object sender, EventArgs e)
        {
            decimal KG = seKG.EditValue.ToDecimalNN();
            if (KG == 0)
            {
                XtraMessageBox.Show("KG yazılmalı!", Language.Uyari, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            AkerDB.IplikRow iplik;

            if (ipId > 0)
                iplik = Data.DB.Iplik.FindByIplikId(ipId);
            else
                iplik = Data.DB.Iplik.NewIplikRow();


            iplik.IplikGrupId = leGrup.EditValue.ToIntNN();

            if (leTedarikci.EditValue.ToIntNN() > 0)
                iplik.TedarikciId = leTedarikci.EditValue.ToIntNN();
            else
                iplik.SetTedarikciIdNull();

            if (leRenk.EditValue.ToIntNN() > 0)
                iplik.RenkId = leRenk.EditValue.ToIntNN();
            else
                iplik.SetRenkIdNull();

            if (txtLot.Text != "")
                iplik.Lot = txtLot.Text.ToUpper();
            else
                iplik.SetLotNull();

            if (txtAltAciklama.Text != "")
                iplik.Aciklama = txtAltAciklama.Text;
            else
                iplik.SetAciklamaNull();
                       
            if (leBoyahane.EditValue.ToIntNN() > 0)
                iplik.BoyahaneId = leBoyahane.EditValue.ToIntNN();
            else
                iplik.SetBoyahaneIdNull();

            decimal fiyat = seFiyat.EditValue.ToDecimalNN();
            if (fiyat > 0)
            {
                iplik.Fiyat = fiyat;
                iplik.KDV = chkKDV.Checked;
                iplik.CurrencyId = cmbCurrencyId.SelectedIndex + 1;
            }
            else
            {
                iplik.SetCurrencyIdNull();
                iplik.SetKDVNull();
                iplik.SetFiyatNull();
            }

            bool yeni = ipId < 1;

            if (ipId < 1)
            {
                iplik.EklenmeTarihi = DateTime.Now;
                iplik.EkleyenId = AppSession.UserInfo.UserId;
                Data.DB.Iplik.AddIplikRow(iplik);
            }

            Data.TAM.IplikTableAdapter.Update(iplik);

            if (yeni)
            {
                AkerDB.StokLinesRow sl = Data.DB.StokLines.NewStokLinesRow();
                sl.IplikId = iplik.IplikId;
                sl.KG = KG;

                if (seCuvalBot.EditValue.ToIntNN() > 0)
                    sl.Adet = seCuvalBot.EditValue.ToIntNN();

                if (leShelf.EditValue.ToIntNN() > 0)
                    sl.ShelfId = leShelf.EditValue.ToIntNN();

                sl.OlusturulmaTarihi = DateTime.Now;
                Data.DB.StokLines.AddStokLinesRow(sl);
                Data.TAM.StokLinesTableAdapter.Update(sl);
            }
            else
            {
                DataRow[] sls = Data.DB.StokLines.Select("IplikId=" + iplik.IplikId);
                if (sls.Length == 1)
                {
                    int shelfId = leShelf.EditValue.ToIntNN();
                    decimal qty = seKG.EditValue.ToDecimalNN();

                    if (shelfId > 0)
                        sls[0]["ShelfId"] = shelfId;
                    else
                        sls[0]["ShelfId"] = DBNull.Value;

                    if (qty > 0)
                        sls[0]["KG"] = qty;
                    else
                        sls[0]["KG"] = DBNull.Value;

                    Data.TAM.StokLinesTableAdapter.Update(sls[0]);
                }
                else
                    throw new ApplicationException("Birden çok giriş var!!");
            }

            BindIplik();

            btnEndIpEditing.PerformClick();
        }

        private void leRenk_QueryPopUp(object sender, CancelEventArgs e)
        {
            e.Cancel = true;
            int renkId = leRenk.EditValue.ToIntNN();
            if (renk.Focus(renkId) == System.Windows.Forms.DialogResult.OK)
                leRenk.EditValue = renk.RenkId;
        }

        #region Set Nulls
        private void btnKarisim2Null_Click(object sender, EventArgs e)
        {
            leKarisim2.EditValue = null;
            seOran2.EditValue = 0;
        }

        private void btnKarisim3Null_Click(object sender, EventArgs e)
        {
            leKarisim3.EditValue = null;
            seOran3.EditValue = 0;
        }


        private void btnIplikCekimTipiNull_Click(object sender, EventArgs e)
        {
            leIplikCekmeTipi.EditValue = null;
        }

        private void btnIplikCekimNull_Click(object sender, EventArgs e)
        {
            leIplikCekim.EditValue = null;
        }

        private void btnTedarikciNull_Click(object sender, EventArgs e)
        {
            leTedarikci.EditValue = null;
        }

        private void btnRenkNull_Click(object sender, EventArgs e)
        {
            leRenk.EditValue = null;
        }

        private void btnBoyahaneNull_Click(object sender, EventArgs e)
        {
            leBoyahane.EditValue = null;
        }

        private void btnShelfNull_Click(object sender, EventArgs e)
        {
            leShelf.EditValue = null;
        }

        private void btnParlaklikNull_Click(object sender, EventArgs e)
        {
            leIplikParlaklik.EditValue = null;
        }

        private void btnKarisim1Null_Click(object sender, EventArgs e)
        {
            leKarisim1.EditValue = null;
            seOran1.EditValue = null;
        }
        #endregion
    }
}
